import {AxiosError} from "axios";
import {InternalRequestConfig} from "./app-request-type.ts";

/**
 * 响应失败拦截器，超出2xx范围的状态码都会触发该函数。不能使用箭头函数，否则无this
 * @param error {
 *   code:
 *   name:
 *   message:
 *   config: axios的请求配置信息
 *   reuqest: 生成此响应的请求。Nodejs中为最后一个ClientRequest实例，浏览器中为XMLHttpRequest实例
 *   response: 由服务器提供的响应axiosResponse {
 *     status: 来自服务器响应的HTTP状态码
 *     statusText: 来自服务器响应的HTTP状态信息
 *     data: 由服务器提供的响应
 *     headers: 服务器响应头。header名都是小写，而且可以使用方括号语法访问，例如`response.headers['content-type']`
 *     config: axios的请求配置信息
 *     reuqest: 生成此响应的请求。Nodejs中为最后一个ClientRequest实例，浏览器中为XMLHttpRequest实例
 *   }
 * }
 */
const handleResponseRejected = function handleResponseRejected(
    error: AxiosError
) {
  // 超出 2xx 范围的状态码都会触发该函数
  // log.debug("AxiosError：{}", error);

  const requestConfig = error.config as InternalRequestConfig;
  const axiosResponse = error.response;

  const errorMessage = !axiosResponse
      ? error.cause.message
      : `HTTP错误：${axiosResponse.status}`;

  if (
      typeof requestConfig.showLoading === "function"
          ? requestConfig.showLoading()
          : requestConfig.showLoading
  ) {
    requestConfig.hideLoadingFunction(false);
  }

  if (requestConfig.showFailureMsg) {
    requestConfig.showFailureMsgFunction(errorMessage);
  }
  return Promise.reject(error);
};

export default handleResponseRejected;
